#define _CRT_SECURE_NO_WARNINGS 1
//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>

//typedef struct Qsort
//{
//	char name[8];
//	int age;
//}Qsort;

//int cmp(void* p1, void* p2)
//{
//	return ((Qsort*)p1)->age - ((Qsort*)p2)->age;
//}

//int cmp(void* p1, void* p2)
//{
//	return strcmp(((Qsort*)p1)->name , ((Qsort*)p2)->name);
//}
//
//int main()
//{
//
//	Qsort People[3];
//	memset(People, 0, sizeof(Qsort) * 3);
//
//	for (int i = 0; i < 3; i++)
//	{
//		scanf("%s %d", People[i].name, &People[i].age);
//		getchar();
//	}
//
//	qsort(People,3,sizeof(Qsort), cmp);
//	
//	for (int i = 0; i < 3; i++)
//	{
//		printf("%s %d\n", People[i].name, People[i].age);
//	}
//
//	return 0;
//}

//int cmp(const void* a, const void* b)
//{
//	return *(int*)a - *(int*)b;
//}
//
//int main()
//{
//
//	int arr[10] = { 1,2,3,7,3,1,5,9,2,5 };
//	qsort(arr, 10, sizeof(int), cmp);
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}

//int cmp(const void* a, const void* b)
//{
//	return *(float*)a - *(float*)b;
//}
//
//int main()
//{
//
//	float farr[5] = { 3.14,5.20,13.14,6.6,11.1 };
//	qsort(farr, 5, 4, cmp);
//	for (int i = 0; i < 5; i++)
//	{
//		printf("%.2f\n", farr[i]);
//	}
//
//	return 0;
//}

#include <stdio.h>
#include <string.h>
#include <assert.h>

typedef struct stu
{
	char name[20];
	int age;
}stu;

int cmp(void* p1, void* p2);
void my_qsort(void* base, size_t num, size_t sz, int (*cmp)(const void*,const void*));
void swap(char* a, char* b, int sz);

int main()

{

	//qsort(base,num,size,cmp)
	stu student[3] = { {"nene",23},{"haha",21},{"miao",22} };
	my_qsort(student, 3, sizeof(stu), cmp);

	for (int i = 0; i < 3; i++)
	{
		printf("%s %d\n", student[i].name, student[i].age);
	}

	return 0;
}

void my_qsort(void* base, size_t num, size_t sz, int (*cmp)(const void*, const void*))
{
	assert(base);

	for (int i = 0; i < num - 1; i++)
	{
		for (int j = 0; j < num - i - 1; j++)
		{
			if (cmp((char*)base + sz * j, (char*)base + sz * (j + 1)) > 0)
				swap((char*)base + sz * j, (char*)base + sz * (j + 1), sz);
		}
	}
}

int cmp(void* p1, void* p2)
{
	return strcmp(((stu*)p1)->name, ((stu*)p2)->name);
}

void swap(char* a, char* b, int sz)
{
	assert(a && b);

	while (sz--)
	{
		char temp = *a;
		*a = *b;
		*b = temp;
		a += 1;
		b += 1;
	}
}